জ্যাকসন (Jackson) ব্যবহার করে কমপ্লেক্স ডেট ফরম্যাট হ্যান্ডল করা খুব সহজ, কারণ এটি ডেট ফরম্যাটিং এবং কাস্টমাইজেশনের জন্য বিভিন্ন বিল্ট-ইন এবং কাস্টম পদ্ধতি প্রদান করে।
নিচে বিভিন্ন পদ্ধতি এবং উদাহরণ দিয়ে বিষয়টি ব্যাখ্যা করা হলো:
1. Default Date Handling
জ্যাকসন ডিফল্টভাবে java.util.Date এবং অন্যান্য ডেট টাইপকে ISO-8601 ফরম্যাটে (যেমন, yyyy-MM-dd'T'HH:mm:ss.SSSZ) Serialize এবং Deserialize করে।
উদাহরণ: Default Date Handling
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
public class DefaultDateExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Date Serialization
Date currentDate = new Date();
String json = mapper.writeValueAsString(currentDate);
System.out.println("Serialized Date: " + json);
// Date Deserialization
Date deserializedDate = mapper.readValue(json, Date.class);
System.out.println("Deserialized Date: " + deserializedDate);
}
}
আউটপুট:
"2024-12-21T09:30:45.123+0000"
2. Custom Date Formats
@JsonFormat Annotation ব্যবহার করে
@JsonFormat অ্যানোটেশন ব্যবহার করে নির্দিষ্ট ডেট ফরম্যাট নির্ধারণ করা যায়।
উদাহরণ: Custom Date Format
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
class Event {
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
private Date eventDate;
// Constructors, Getters, and Setters
public Event() {}
public Event(String name, Date eventDate) {
this.name = name;
this.eventDate = eventDate;
}
@Override
public String toString() {
return "Event{name='" + name + '\'' + ", eventDate=" + eventDate + '}';
}
}
public class CustomDateFormatExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Event event = new Event("Conference", new Date());
// Serialize
String json = mapper.writeValueAsString(event);
System.out.println("Serialized JSON: " + json);
// Deserialize
String eventJson = "{\"name\":\"Conference\",\"eventDate\":\"21-12-2024 15:30:00\"}";
Event deserializedEvent = mapper.readValue(eventJson, Event.class);
System.out.println("Deserialized Object: " + deserializedEvent);
}
}
আউটপুট:
Serialized JSON: {"name":"Conference","eventDate":"21-12-2024 15:30:00"}
Deserialized Object: Event{name='Conference', eventDate=Sat Dec 21 15:30:00 GMT 2024}
Global Date Format সেট করা
ObjectMapper-এর মাধ্যমে পুরো অ্যাপ্লিকেশনে ডেট ফরম্যাট নির্ধারণ করা যায়।
উদাহরণ: Global Date Format
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.StdDateFormat;
public class GlobalDateFormatExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Global date format
mapper.setDateFormat(new StdDateFormat());
Date currentDate = new Date();
// Serialize
String json = mapper.writeValueAsString(currentDate);
System.out.println("Serialized JSON: " + json);
// Deserialize
Date deserializedDate = mapper.readValue(json, Date.class);
System.out.println("Deserialized Date: " + deserializedDate);
}
}
3. Custom Serializer এবং Deserializer
কাস্টম লজিক প্রয়োগ করে ডেট ফরম্যাট হ্যান্ডল করা যায়।
উদাহরণ: Custom Serializer
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
class CustomDateSerializer extends JsonSerializer<Date> {
private static final SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(formatter.format(date));
}
}
class EventCustom {
private String name;
@com.fasterxml.jackson.databind.annotation.JsonSerialize(using = CustomDateSerializer.class)
private Date eventDate;
// Constructors, Getters, and Setters
public EventCustom(String name, Date eventDate) {
this.name = name;
this.eventDate = eventDate;
}
}
public class CustomSerializerExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
EventCustom event = new EventCustom("Seminar", new Date());
String json = mapper.writeValueAsString(event);
System.out.println("Serialized JSON: " + json);
}
}
আউটপুট:
{"name":"Seminar","eventDate":"21/12/2024 15:45:00"}
উদাহরণ: Custom Deserializer
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
class CustomDateDeserializer extends JsonDeserializer<Date> {
private static final SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String date = p.getText();
try {
return formatter.parse(date);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
class EventCustomDeserialization {
private String name;
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = CustomDateDeserializer.class)
private Date eventDate;
// Getters, Setters, and toString
public EventCustomDeserialization() {}
public EventCustomDeserialization(String name, Date eventDate) {
this.name = name;
this.eventDate = eventDate;
}
@Override
public String toString() {
return "Event{name='" + name + '\'' + ", eventDate=" + eventDate + '}';
}
}
public class CustomDeserializerExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String json = "{\"name\":\"Workshop\",\"eventDate\":\"21/12/2024\"}";
EventCustomDeserialization event = mapper.readValue(json, EventCustomDeserialization.class);
System.out.println("Deserialized Object: " + event);
}
}
আউটপুট:
Deserialized Object: Event{name='Workshop', eventDate=Sat Dec 21 00:00:00 GMT 2024}
4. টিপস
- ডিফল্ট ফরম্যাট: ISO-8601 ফরম্যাট ব্যবহার করতে হলে কোনো অতিরিক্ত কনফিগারেশনের প্রয়োজন নেই।
- কাস্টম ফরম্যাট: অ্যাপ্লিকেশনের প্রয়োজন অনুযায়ী
@JsonFormatবা কাস্টম Serializer/Deserializer ব্যবহার করুন। - Time Zones: সময় অঞ্চলের পার্থক্য থাকলে
java.timeপ্যাকেজ (যেমনLocalDateTime,ZonedDateTime) ব্যবহার করা ভালো।
Content added By
Read more